import random
import re

separators = ' ，。？！“”：；（）、,.?!"\';:()/'

def split(text, sep):
    # 将分隔符列表转换为正则表达式模式，使用管道符号 '|' 表示“或”
    pattern = '|'.join(re.escape(s) for s in sep)
    # 使用 re.split 分割字符串，并保留分隔符在前一个子字符串中
    # re.split 默认会将分隔符丢弃，通过捕获组可以保留分隔符效果
    # 这里巧妙地使用空的正向肯定查找 (?=sep) 来模拟保留分隔符在前一个子字符串中的效果
    # 但由于我们需要分隔符效果在前一个部分，所以不使用正向肯定查找，而是手动处理
    # 可以先分割字符串，然后手动合并
    parts = re.split(f'([{pattern}])', text)
    # 合并相邻的文本部分和分隔符部分（如果有的话）
    splitted_list = []
    i = 0
    while i < len(parts):
        if i % 2 == 0:  # 文本部分
            if i + 1 < len(parts) and parts[i + 1] in sep:
                # 合并当前文本部分和下一个分隔符部分
                splitted_list.append(parts[i] + parts[i + 1])
                i += 2  # 跳过下一个分隔符部分
            else:
                splitted_list.append(parts[i])
                i += 1
        else:
            # 不应该到达这里，因为我们的正则表达式保证了文本部分和分隔符部分交替出现
            i += 1
    # 清理可能存在的空字符串（例如，如果文本以分隔符结尾）
    return [part for part in splitted_list if part]

def swap_characters(string, swap_n_times, max_distance=2):
    # 将字符串转换为列表，因为字符串在Python中是不可变的
    chars = list(string)
    length = len(chars)
    # 记录已经交换过的字符的索引
    swapped_indices = set()
    # 进行n次交换
    for _ in range(swap_n_times):
        # 随机选择一个未交换过的字符的索引
        while True:
            index1 = random.randint(0, length - 1)
            if index1 not in swapped_indices:
                break
        # 在允许的范围内随机选择一个与index1相距不超过max_distance的未交换过的字符的索引
        valid_indices = [i for i in range(max(0, index1 - max_distance), min(length, index1 + max_distance + 1)) if
                         i != index1 and i not in swapped_indices]
        if not valid_indices:
            # 如果没有有效的索引可以交换，则提前结束循环
            break
        index2 = random.choice(valid_indices)
        # 交换字符
        chars[index1], chars[index2] = chars[index2], chars[index1]
        # 将交换过的索引添加到集合中
        swapped_indices.update([index1, index2])
        # 如果所有字符都已经被交换过，则提前结束循环
        if len(swapped_indices) == length:
            break
    # 将列表转换回字符串
    return ''.join(chars)

def swap(splitted_list):
    processed_elements = []  # 创建一个空列表来收集处理过的元素
    for element in splitted_list:
        if len(element) <= 5:
            processed_elements.append(swap_characters(element[:-1], 2)+element[-1])
        elif len(element) <= 10:
            processed_elements.append(swap_characters(element[:-1], 3)+element[-1])
        elif len(element) <= 20:
            processed_elements.append(swap_characters(element[:-1], 4)+element[-1])
        else:
            processed_elements.append(swap_characters(element[:-1], 5)+element[-1])
    # 使用""连接所有处理过的元素，注意这里不要加最后的逗号
    salted = "".join(processed_elements)
    return salted
